/**
 * AES 加密工具类
 * 与后端 Flutter 保持一致的加密规格
 * 
 * 加密规格：
 * - 算法: AES-256-CBC
 * - 密钥: qwertyuiop1234567654zaqwsxcderfv (32字节)
 * - IV: 随机生成16字节
 * - 填充: PKCS7
 * - 编码: Base64
 */

const CryptoJS = require('../crypto-full.js');

// AES密钥（32字节，与Flutter保持一致）
const SECRET_KEY = 'qwertyuiop1234567654zaqwsxcderfv';

/**
 * AES 加密
 * @param {string} data - 待加密的 JSON 字符串
 * @returns {string} Base64 编码的加密字符串（IV + 加密数据）
 */
function aesEncrypt(data) {
  try {
    console.log('🔐 开始AES加密');
    console.log('📝 原始数据:', data);

    // 生成随机 IV（16字节）
    const iv = CryptoJS.lib.WordArray.random(16);
    console.log('🔑 生成的IV:', CryptoJS.enc.Base64.stringify(iv));

    // 将密钥转换为 WordArray
    const key = CryptoJS.enc.Utf8.parse(SECRET_KEY);

    // 进行加密（使用 CBC 模式和 PKCS7 填充）
    const encrypted = CryptoJS.AES.encrypt(data, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    });

    // 将 IV 和加密数据拼接
    const ivWords = iv.words;
    const encryptedWords = encrypted.ciphertext.words;
    const combinedWords = ivWords.concat(encryptedWords);
    const combinedWordArray = CryptoJS.lib.WordArray.create(combinedWords);

    // Base64 编码
    const result = CryptoJS.enc.Base64.stringify(combinedWordArray);

    console.log('📦 加密结果长度:', result.length);
    console.log('🔒 加密数据:', result);
    console.log('✅ AES加密成功');

    return result;
  } catch (e) {
    console.error('❌ AES加密失败:', e);
    throw new Error('AES加密失败: ' + e.message);
  }
}

/**
 * 创建加密载荷
 * @param {Object} data - 原始数据对象
 * @returns {Object} 包含 encrypted_data 字段的对象
 */
function createEncryptedPayload(data) {
  try {
    console.log('📋 创建加密载荷');
    console.log('📊 原始数据:', JSON.stringify(data));

    // 创建新对象，避免修改原始数据
    const dataWithTimestamp = Object.assign({}, data);

    // 添加当前时间戳（秒级，数字类型）
    const timestamp = Math.floor(Date.now() / 1000);
    dataWithTimestamp.timestamp = timestamp;

    console.log('⏰ 添加时间戳:', timestamp);
    console.log('📊 完整数据:', JSON.stringify(dataWithTimestamp));

    // 转换为 JSON 字符串
    const jsonData = JSON.stringify(dataWithTimestamp);
    console.log('📄 JSON字符串:', jsonData);
    console.log('📏 JSON长度:', jsonData.length, '字符');

    // 进行 AES 加密
    const encryptedData = aesEncrypt(jsonData);

    // 创建加密载荷
    const payload = {
      encrypted_data: encryptedData
    };

    console.log('📦 加密载荷创建完成');

    return payload;
  } catch (e) {
    console.error('💥 创建加密载荷失败:', e);
    throw new Error('创建加密载荷失败: ' + e.message);
  }
}

/**
 * AES 解密（用于调试验证）
 * @param {string} encryptedData - Base64 编码的加密字符串
 * @returns {string} 解密后的原始数据
 */
function aesDecrypt(encryptedData) {
  try {
    console.log('🔓 开始AES解密验证');
    console.log('🔒 加密数据:', encryptedData);

    // Base64 解码
    const combinedWordArray = CryptoJS.enc.Base64.parse(encryptedData);

    // 分离 IV（前16字节）和加密数据
    const ivWords = CryptoJS.lib.WordArray.create(
      combinedWordArray.words.slice(0, 4)
    ); // 16字节 = 4个word
    const encryptedWords = CryptoJS.lib.WordArray.create(
      combinedWordArray.words.slice(4)
    );

    console.log('🔑 解析的IV:', CryptoJS.enc.Base64.stringify(ivWords));

    // 将密钥转换为 WordArray
    const key = CryptoJS.enc.Utf8.parse(SECRET_KEY);

    // 进行解密
    const decrypted = CryptoJS.AES.decrypt(
      { ciphertext: encryptedWords },
      key,
      {
        iv: ivWords,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      }
    );

    const decryptedText = CryptoJS.enc.Utf8.stringify(decrypted);

    console.log('📝 解密结果:', decryptedText);
    console.log('✅ AES解密验证成功');

    return decryptedText;
  } catch (e) {
    console.error('❌ AES解密验证失败:', e);
    throw new Error('AES解密验证失败: ' + e.message);
  }
}

module.exports = {
  aesEncrypt,
  aesDecrypt,
  createEncryptedPayload
};

